using Spine.Unity;
using System.Collections;
using UnityEngine;

namespace Spine.Unity.Examples {
    // 该类演示Spine动画状态机的基本使用方法
    public class SpineBeginnerTwo : MonoBehaviour {

        #region Inspector配置区
        // [SpineAnimation]特性会在Inspector生成动画名称下拉菜单
        [SpineAnimation]
        public string runAnimationName;    // 奔跑动画资源名称
        
        [SpineAnimation]
        public string idleAnimationName;   // 待机动画资源名称
        
        [SpineAnimation]
        public string walkAnimationName;   // 行走动画资源名称
        
        [SpineAnimation]
        public string shootAnimationName;  // 射击动画资源名称

        [Header("动画过渡配置")]
        [SpineAnimation]
        public string idleTurnAnimationName; // 转身空闲动画
        
        [SpineAnimation]
        public string runToIdleAnimationName; // 跑步转空闲动画
        
        // 跑步与行走动画切换的持续时间（单位：秒）
        public float runWalkDuration = 1.5f;
        #endregion

        // Spine核心组件 -- 骨骼动画控制器
        SkeletonAnimation skeletonAnimation;
        
        // Spine系统对象（需在Start后获取）
        public Spine.AnimationState spineAnimationState; // 动画状态机
        public Spine.Skeleton skeleton;                // 骨骼数据

        void Start () {
            // 获取组件引用
            skeletonAnimation = GetComponent<SkeletonAnimation>();
            spineAnimationState = skeletonAnimation.AnimationState;
            skeleton = skeletonAnimation.Skeleton;

            // 启动动画演示协程
            StartCoroutine(DoDemoRoutine());
        }

        /// <summary>
        /// 无限循环的动画状态演示协程
        /// </summary>
        IEnumerator DoDemoRoutine () {
            while (true) {
                // 播放行走动画（轨道0，循环播放）
                spineAnimationState.SetAnimation(0, walkAnimationName, true);
                yield return new WaitForSeconds(runWalkDuration);

                // 切换跑步动画（轨道0，覆盖播放）
                spineAnimationState.SetAnimation(0, runAnimationName, true);
                yield return new WaitForSeconds(runWalkDuration);

                // 动画过渡演示：跑步转空闲
                // 1. 设置过渡动画
                spineAnimationState.SetAnimation(0, runToIdleAnimationName, false);
                
                // 2. 添加后续待机动画（循环播放，立即开始）
                spineAnimationState.AddAnimation(0, idleAnimationName, true, 0);
                yield return new WaitForSeconds(1f);

                // 骨骼翻转演示（水平镜像）
                skeleton.ScaleX = -1;       // 修改骨骼缩放实现翻转
                
                // 播放转身动画
                spineAnimationState.SetAnimation(0, idleTurnAnimationName, false);
                
                // 添加持续待机动画
                spineAnimationState.AddAnimation(0, idleAnimationName, true, 0);
                yield return new WaitForSeconds(0.5f);
                
                // 恢复原始朝向
                skeleton.ScaleX = 1;
                
                // 再次播放转身动画（反向）
                spineAnimationState.SetAnimation(0, idleTurnAnimationName, false);
                // 添加持续待机动画
                spineAnimationState.AddAnimation(0, idleAnimationName, true, 0);
                yield return new WaitForSeconds(0.5f);
            }
        }
    }
}